package com.sky.testmodule.controller.redis;

import com.sky.testmodule.constant.TestConstant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.DefaultTypedTuple;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * @author zhiwei Liao
 * @version 1.0
 * @Description
 * @Date 2021/9/22 16:58
 */
@RequestMapping("/zset")
@RestController
public class ZsetController {

    @Autowired
    RedisTemplate redisTemplate;

    @GetMapping("/zsetCache")
    public void zsetCache(){
        //向集合中插入元素，并设置分数
        redisTemplate.opsForZSet().add(TestConstant.KEY_TEST, TestConstant.OBJECT_CACHE_KEY, 2.1);
        //向集合中插入多个元素
        DefaultTypedTuple<String> defaultTypedTuple1 = new DefaultTypedTuple<>(TestConstant.OBJECT_CACHE_KEY, 1.1);
        DefaultTypedTuple<String> defaultTypedTuple2 = new DefaultTypedTuple<>(TestConstant.OBJECT_CACHE_KEY, 3.1);
        redisTemplate.opsForZSet().add(TestConstant.KEY_TEST, new HashSet<>(Arrays.asList(defaultTypedTuple1, defaultTypedTuple2)));
        //从集合中删除指定元素
        redisTemplate.opsForZSet().remove(TestConstant.KEY_TEST, TestConstant.OBJECT_CACHE_KEY);
        //为指定元素加分
        redisTemplate.opsForZSet().incrementScore(TestConstant.KEY_TEST, TestConstant.OBJECT_CACHE_KEY, 2);
        //返回指定成员的排名（从小到大）
        redisTemplate.opsForZSet().rank(TestConstant.KEY_TEST, TestConstant.OBJECT_CACHE_KEY);
        //从大到小
        redisTemplate.opsForZSet().reverseRank(TestConstant.KEY_TEST, TestConstant.OBJECT_CACHE_KEY);
        //返回集合内元素的排名，以及分数（从小到大）
        Set<ZSetOperations.TypedTuple<String>> tuples = redisTemplate.opsForZSet().rangeWithScores(TestConstant.KEY_TEST, 0, -1);
        for (ZSetOperations.TypedTuple<String> tuple : tuples) {
            System.out.println(tuple.getValue() + " : " + tuple.getScore());
        }
        //返回集合内元素在指定分数范围内的排名（从小到大）
        redisTemplate.opsForZSet().rangeByScore(TestConstant.KEY_TEST, 0, 5);
        //带偏移量和个数，下例意为从第二个开始，要三个
        redisTemplate.opsForZSet().rangeByScore(TestConstant.KEY_TEST, 0, 5, 1, 3);
        //返回集合内指定分数范围的成员个数
        redisTemplate.opsForZSet().count(TestConstant.KEY_TEST, 0, 2);
        //返回集合内的成员个数
        redisTemplate.opsForZSet().size(TestConstant.KEY_TEST);//等同于zCard(key);
        //获得指定元素的分数
        redisTemplate.opsForZSet().score(TestConstant.KEY_TEST, TestConstant.OBJECT_CACHE_KEY);
        //删除指定索引范围的元素
        redisTemplate.opsForZSet().removeRange(TestConstant.KEY_TEST, 0, 0);
        //按照排名先后(从小到大)打印指定区间内的元素, -1为打印全部
         redisTemplate.opsForZSet().range(TestConstant.KEY_TEST, 0, -1);
        //按照排名先后(从大到小 )打印指定区间内的元素, -1为打印全部
        redisTemplate.opsForZSet().reverseRange(TestConstant.KEY_TEST, 0, -1);
        //删除指定分数范围内的元素
        redisTemplate.opsForZSet().removeRangeByScore(TestConstant.KEY_TEST, 4, 5);
    }

}
